package com.tkp.utils;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author: duk
 * @Date: 2022/3/9 13:30
 * @Description: 集合工具
 */
public class EntityUtil {

    /**
     * 将dao转换为dto
     * @param clazz dao类
     * @param dao dto类
     * @param <DAO> dao约束
     * @param <DTO> dto约束
     * @return 拷贝之后的dao
     * @throws IllegalAccessException
     * @throws InstantiationException
     */
    public static<DTO,DAO> DTO toDTO(Class<DTO> clazz,DAO dao) throws IllegalAccessException, InstantiationException {
        DTO dto = clazz.newInstance();
        BeanUtils.copyProperties(dao,dto);
        return dto;
    }

    /**
     * dao转换dto方法
     * @param clazz dto类
     * @param daoList dao集合
     * @param <DTO> dto抽象
     * @param <DAO> dao抽象
     * @return 拷贝完成的dto对象
     */
    public static <DTO,DAO> List<DTO> toDTO(Class<DTO> clazz, List<DAO> daoList){
        List<DTO> dtoList = new ArrayList<>();
        for (DAO dao : daoList) {
            try {
                dtoList.add(toDTO(clazz,dao));
            } catch (IllegalAccessException | InstantiationException e) {
                e.printStackTrace();
            }
        }
        return dtoList;
    }

    /**
     * mybatisplus分页 dao转换dto方法
     * @param clazz dto类
     * @param daoPage dao集合
     * @param <DTO> dto抽象
     * @param <DAO> dao抽象
     * @return 拷贝完成的分页
     */
    public static <DTO,DAO> IPage<DTO> toiPageDTO(Class<DTO> clazz, IPage<DAO> daoPage){
        IPage<DTO> dtoPage = new Page<>(daoPage.getCurrent(),daoPage.getSize());
        if (daoPage.getTotal() > 0){
            List<DTO> dtoList = toDTO(clazz, daoPage.getRecords());
            dtoPage.setRecords(dtoList);
            dtoPage.setTotal(daoPage.getTotal());
            dtoPage.setPages(daoPage.getPages());
        }
        return dtoPage;
    }

    /**
     * 将dto转换为dao
     * @param clazz dao类
     * @param dto dto类
     * @param <DAO> dao约束
     * @param <DTO> dto约束
     * @return 拷贝之后的dao
     */
    public static<DAO,DTO> DAO toDAO(Class<DAO> clazz,DTO dto) throws IllegalAccessException, InstantiationException {
        DAO dao = clazz.newInstance();
        BeanUtils.copyProperties(dto,dao);
        return dao;
    }

    /**
     * dto转换dao方法
     * @param clazz dao类
     * @param dtoList dto集合
     * @param <DTO> dto抽象
     * @param <DAO> dao抽象
     * @return 拷贝完成的dao对象
     */
    public static <DAO,DTO> List<DAO> toDAO(Class<DAO> clazz, List<DTO> dtoList){
        List<DAO> daoList = new ArrayList<>();
        for (DTO dto : dtoList) {
            try {
                daoList.add(toDAO(clazz,dto));
            } catch (IllegalAccessException | InstantiationException e) {
                e.printStackTrace();
            }
        }
        return daoList;
    }


}
